package com.netsuite.dao;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.rpc.ServiceException;
import javax.xml.soap.SOAPException;

import com.netsuite.constants.Constants;
import com.netsuite.helper.ErrorHelper;
import com.netsuite.logger.LoggerImp;
import com.netsuite.webservices.lists.accounting_2014_1.Currency;
import com.netsuite.webservices.platform.core_2014_1.GetAllRecord;
import com.netsuite.webservices.platform.core_2014_1.GetAllResult;
import com.netsuite.webservices.platform.core_2014_1.Record;
import com.netsuite.webservices.platform.core_2014_1.RecordList;
import com.netsuite.webservices.platform.core_2014_1.types.GetAllRecordType;
import com.netsuite.webservices.platform.faults_2014_1.ExceededRecordCountFault;
import com.netsuite.webservices.platform.faults_2014_1.ExceededRequestLimitFault;
import com.netsuite.webservices.platform.faults_2014_1.ExceededRequestSizeFault;
import com.netsuite.webservices.platform.faults_2014_1.ExceededUsageLimitFault;
import com.netsuite.webservices.platform.faults_2014_1.InvalidCredentialsFault;
import com.netsuite.webservices.platform.faults_2014_1.InvalidSessionFault;
import com.netsuite.webservices.platform_2014_1.NetSuitePortType;

public class CurrencyDAO {

private static String CLASS_NAME = PaymentMethodDAO.class.getName();
	
	private NetSuitePortType _service = null;

	public CurrencyDAO() throws ErrorHelper {
		try {
			MainDAO mainDAO = new MainDAO();
			_service = mainDAO.get_service();
		} catch (FileNotFoundException e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_FNF+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_FNF+ e.getMessage());
		} catch (ServiceException e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_SE+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_SE+ e.getMessage());
		} catch (IOException e) {
			LoggerImp.errorLog(CLASS_NAME,Constants.ERROR_IO+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_IO+ e.getMessage());
		} catch (SOAPException e) {
			LoggerImp.errorLog(CLASS_NAME,Constants.ERROR_SOAP+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_SOAP+ e.getMessage());
		}

	}
	
	public List<Currency> getAllCurrencies() throws ErrorHelper{

		LoggerImp.startLog(CLASS_NAME, "getAllCurrencies()");
		
		List<Currency> currList = new ArrayList<Currency>();
	
		GetAllRecord stateRef = new GetAllRecord();
		stateRef.setRecordType(GetAllRecordType.currency);
	
		try {
			GetAllResult readResponse = _service.getAll(stateRef);
			if(readResponse.getStatus().isIsSuccess()){
				RecordList recList = readResponse.getRecordList();
				for (Record record: recList.getRecord()){
					Currency curr = (Currency) record;
					currList.add(curr);
				}
				LoggerImp.infoLog(CLASS_NAME, "Load Successful: No. of Records Generated = "+currList.size());
			} 
		} catch (ExceededRequestSizeFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_SIZ+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_SIZ+ e.getMessage());
		} catch (InvalidCredentialsFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_INV+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_INV+ e.getMessage());
		} catch (ExceededUsageLimitFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_USE+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_USE+ e.getMessage());
		} catch (ExceededRequestLimitFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_REQ+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_REQ+ e.getMessage());
		} catch (ExceededRecordCountFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_MAX+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_MAX+ e.getMessage());
		} catch (InvalidSessionFault e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_SES+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_SES+ e.getMessage());
		} catch (RemoteException e) {
			LoggerImp.errorLog(CLASS_NAME, Constants.ERROR_REM+ e.getMessage());
			throw new ErrorHelper(CLASS_NAME,Constants.ERROR_SES+ e.getMessage());
		}
		
		LoggerImp.endLog(CLASS_NAME, "getAllCurrencies()");
		
		return currList;
		
	}
	

}
